#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

#define N 5

typedef  void(*taskptr)();

taskptr tpi[N];
void task1()
{
    printf("执行一个打印日志的任务\n");
}

void task2()
{
    printf("执行一个检查网络健康状态的任务\n");
}

void task3()
{
    printf("执行一个刷新数据的任务\n");
}

void InitTask(taskptr* p)
{
    for(int i=0;i<N;i++)
    {
        p[i]=NULL;
    }
}

void addtask(taskptr t)
{
    int i=0;
    for(;i<N;i++)
    {
        if(!tpi[i])
            break;
    }
    if(i==N) return ;
    tpi[i]=t;
}

void runtask()
{   
    int i=0;
    for(;tpi[i];i++)
    {
        tpi[i]();
    }

    return ;
}



//void runChild()
//{
//    int cnt = 5;
//    while(cnt)
//    {
//        printf("I am Child Process, pid: %d, ppid:%d\n", getpid(), getppid());
//        sleep(1);
//        cnt--;
//    }
//}

int main()
{
    pid_t id=fork();
    if(id==0)
    {
        int cnt=5;
        while(cnt)
        {
            printf("i am child: pid:%d , ppid:%d ,cnt:%d\n",getpid(),getppid(),cnt);
            cnt--;
            sleep(1);
        }

        exit(0);
    }
    else if(id >0)
    {

        //parent 
        addtask(task1);
        addtask(task2);
        addtask(task3);
        while(1)
        { 
            pid_t ret=waitpid(id,NULL,WNOHANG);
            if(ret==id)
            {
                printf("wait %d success!\n",ret);
                break;
            }
            else if(ret==0)
            {
                //做自己的事情         
                 sleep(1);
                runtask();
                //printf("你好了没？子进程还没有退出，我在等等...\n");
            }
            else 
            {
                perror("waitpid");
                break;
            }
        }
    }

    return 0;
}

//int main()
//{
//    for(int i=0;i<N;i++)
//    {
//        pid_t id=fork();
//        if(id==0)
//        {
//            runChild();
//            exit(i);
//        }
//
//        printf("create child process: %d success\n", id); // 这句话只有父进程才会执行
//    }
//    
//    int status=0;
//    for(int i=0;i<N;i++)
//    {
//        //pid_t ret=waitpid(-1,&status,0);
//        while(1)//轮询
//        { //-1是等待任意子进程 stauts是输出型参数 WNOHANG是非阻塞轮询
//            pid_t ret=waitpid(-1,&status,WNOHANG);
//            if(ret>0)
//            {
//                //printf("wait %d success!\n exit sig:%d exit code:%d\n",ret,status&0x7F,(status>>8)&0xFF);
//                if(WIFEXITED(status))
//                {
//                    printf("进程是正常跑完的, 退出码:%d\n", WEXITSTATUS(status));
//                }
//                else
//                {
//                    printf("进程异常退出\n");
//                }
//
//                break;
//            }
//            else if(ret<0)
//            {
//                printf("wait fail\n");
//                break;
//            }
//            else if(ret==0)
//            {
//                sleep(1);
//                printf("你好了没？子进程还没有退出，我在等等...\n");
//            }
//        }
//        sleep(1);
//    }
//   
//    sleep(10);
//
//    return 12;
//}

//int main()
//{
//    printf("begin: pid:%d,ppid:%d\n",getpid(),getppid());
//    pid_t id = fork();
//    if(id < 0)
//    {
//        //error
//        perror("fork()");
//
//        exit(-1);
//    }
//    if(id == 0)
//    {
//        //child
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("I am child：pid:%d, ppid:%d,%d\n",getpid(),getppid(),cnt);
//            cnt--;
//            sleep(1);
//        }
//    }
//    else
//    {
//        //father
//        sleep(5);
//        pid_t id = wait(NULL);
//
//        sleep(1000);
//    }
//
//    return 0;
//}
